#include<stdio.h>
#include<iostream> 
#include<unistd.h>
#include<sys/types.h>
#include<assert.h> 
#include<stdlib.h>
using namespace std;
#include<string.h>
#include<sys/wait.h>
#include<sys/types.h>

//bint g_val=100;


//设置任务
void sync_disk()
{
  cout<<"这是一个刷新数据的任务"<<endl;
}
void sync_log()
{
  cout<<"这是一个同步日志的任务"<<endl;
}
void net_send()
{
  cout<<"这是一个进行网络发送的任务"<<endl;
}

//定义任务类型
typedef void(*func_t)();
//定义任务最大个数
#define TASK_NUM 10
//定义任务存储数组
func_t task[TASK_NUM]={nullptr};

int LoadTask(func_t x)
{
  int i=0;
  for(i=0;i<TASK_NUM;++i)
  {
    if(task[i]==nullptr)
      break;
  }
  if(i==TASK_NUM)return -1;

  task[i]=x;
  return 0;
}

void InitTask()
{
  for(int i=0;i<TASK_NUM;++i)task[i]=nullptr;

  LoadTask(sync_log);
  LoadTask(sync_disk);
  LoadTask(net_send);
}

void RunTask()
{
  for(int i=0;task[i]!=nullptr;++i)
  {
    task[i]();
  }
}



int main()
{
  pid_t id=fork();
  if(id==0)
  {
    //子进程
    int cnt=5;
    while(cnt)
    {
      printf("我是子进程，我还活着，我还有%ds,pid:%d,ppid:%d\n",cnt--,getpid(),getppid());
      sleep(1);
     // int a= 0/0;
    }
    exit(107);
  }
  //父进程
  while(1)
  {
     int status=0;
     pid_t ret_id = waitpid(id,&status,WNOHANG);
     if(ret_id <0)
     {
       cout<<"waitpid error!"<<endl;
       exit(1);
     }
     else if(ret_id==0)
     {
       InitTask();
       RunTask();

     //  printf("子进程还没有退出，我先去做做其它的事情...\n");
       sleep(1);
       continue;
     }
     else {

       printf("我是父进程，等待子进程成功，pid:%d,ppid:%d,ret_id:%d,child exit code=%d,child exit singal =%d\n",\
        getpid(),getppid(),ret_id,(status>>8)&0xFF,status&0x7F);
       break;
     }
   }


  
//  sleep(5);
//bin  pid_t ret_id=wait(NULL);
//  printf("我是父进程，等待子进程成功，pid:%d,ppid:%d,ret_id:%d\n",getpid(),getppid(),ret_id);
//  sleep(5);
//  for(int i=0;i<200;++i)
//  {
//    printf("%d:%s\n ",i,strerror(i));
//  }
//
//
//
//  printf("Hello Linux");
//  sleep(2);
  return 0;
//   _exit(0);
//  exit(1);


//  pid_t pid=0;
//  printf("Before: pid is %d\n",getpid());
//  pid=fork();
//  assert(pid>=0);
//  printf("After:pid is %d,fork return %d\n",getpid(),pid);
//  sleep(2);
//

  return 0;
}
//  pid_t id=fork();
//  assert(id>=0);
//  if(id ==0)
//  {
//    //子进程
//    while(1)
//    {
//      printf("我是子进程，pid:%d,ppid:%d,g_val=%d,&g_val=%p\n",getpid(),getppid(),g_val++,&g_val);
//      sleep(1);
//    }
//
//  }
//  else if(id >0)
//  {
//    //父进程
//    while(1)
//    {
//      printf("我是父进程，pid:%d,ppid:%d,g_val=%d,&g_val=%p\n",getpid(),getppid(),g_val,&g_val);
//      sleep(1);
//    }
//  }
//  return 0;
//}
